package no.ntnu.idi.deid.patternmatching.search.dictionary.medicalcodes;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

import no.ntnu.idi.deid.config.FilePaths;
import no.ntnu.idi.deid.documentunits.Token;
import no.ntnu.idi.deid.searchresultunits.CategoryTag;
import no.ntnu.idi.deid.searchresultunits.Tag;

/*
 * ***************************MEDISINSKE NØKKELORD****************************
 * 
 * <<<< KLASSIFISERINGSSYSTEM>>
<<< 0: Administrativ term
<<< A: Agensrelatert begrep - årsak
<<< D: diagnoserelatert begrep
<<< L: begrep relatert til lokasjon/anatomi
<<< R: relasjonsbegrep; 
<<< S: symptomrelatert begrep
<<< T: tiltaks/behandlingsrelatert begrep
<<< F/: fullt ord; 
<<< S/: ord-Stamme; 
<<< A/: Avkortet ord
<<<< nøkkelordene er hentet  fra ICD-10 + NCSP+ NIS-behandlingskoder + DRG-koder + ICD-9>>>>>
<<<< alfabetisk sortering >>>>>
<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>
 * 
 * Husk å gjøre alle ordene om til små bokstaver
 * 
 * Lager en private konstruktør og en statisk metode som oppretter det statiske map'et. 
 * 
 * Noen endringer har blitt gjort på selve lista. Fjernet ord (veldig få) som hadde kode='N'. 
 * Dette var ord som "ikke, uten, intet, normal...", altså helt vanlige ord. 
 * 
 * Det er 73 elementer som starter med bokstaven T som egentgli skal angi ordformen. Denne er ikke angitt i klassifiseringssystemet.
 * Foreløpig vil disse få ordform NULL. 
 * 
 * 
 * Lager categorytag av et Medical_Keyword, med 
 * categorytag.code = Medical_keyword.code.description
 * categorytag.descrition = Medical_Keyword.wordform
 * 
 */

public class Medical_Keyword implements Comparable<Medical_Keyword>{
	
	private static Map<String, Medical_Keyword> MEDICAL_KEYWORD_MAP;
	
	private KEYWORD_CODE code;
	private String wordForm; 
	private String word;
	
	private static void instantiate(){
		if(MEDICAL_KEYWORD_MAP == null){
			try {
				instantiateMap();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public static CategoryTag searchInMedicalKeywords(Token t) {
		instantiate();
		if(MEDICAL_KEYWORD_MAP.containsKey(t.getStripped())){
			Medical_Keyword mk = MEDICAL_KEYWORD_MAP.get(t.getStripped());
			CategoryTag tag = new CategoryTag(Tag.MEDICALKEYWORD);
			tag.setValues(mk.code.description, mk.wordForm);
			return tag;
		}
		return null;
	}
	
	private Medical_Keyword(String WORD, String WORDFORM, KEYWORD_CODE CODE){
		code = CODE;
		wordForm = WORDFORM;
		word = WORD;
	}
	
	private static void instantiateMap() throws FileNotFoundException{
		MEDICAL_KEYWORD_MAP = new HashMap<String, Medical_Keyword>();
		Scanner sc = new Scanner(new File(FilePaths.getMedicalKeywordsPath()));
		while(sc.hasNextLine()){
			String line = sc.nextLine();
			if(!(line.contains("$$$")) && (!line.isEmpty())){readAndHandleLine(line);}
		}
		sc.close();
		
	}
	
	private static void readAndHandleLine(String line){
		String word = line.substring(0, line.indexOf(';'));
		String postfix = line.substring(line.indexOf(";"));
		char wform = postfix.charAt(1);
		char keyword_code = postfix.charAt(3);
		Medical_Keyword temp = new Medical_Keyword(word, getWordformByCode(wform), getKeywordByCode(keyword_code));
		MEDICAL_KEYWORD_MAP.put(word,temp);
	}
	
	public static String getWordformByCode(char c){
		switch (Character.toUpperCase(c)) {
		case 'F':
			return "Fullt ord";
		case 'A':
			return "Avkortet ord";
		case 'S':
			return "Ord-Stamme";
		default:
			//errorcount += 1;
			return null;
		}
		
	}

	
	private static KEYWORD_CODE getKeywordByCode(char c){
		switch (Character.toUpperCase(c)) {
		case '0':
			return KEYWORD_CODE.ADMIN;
		case 'A':
			return KEYWORD_CODE.CAUSE;
		case 'D':
			return KEYWORD_CODE.DIAGNOSE;
		case 'L':
			return KEYWORD_CODE.ANATOMI;
		case 'R':
			return KEYWORD_CODE.RELATION;
		case 'S':
			return KEYWORD_CODE.SYMPTOM;
		case 'T':
			return KEYWORD_CODE.ACTION;
		default:
			//errorcount += 1;
			System.err.println("It does not exist a KEYWORD by the code " + c);
			return null;
		}
	}
	
	@Override
	public int compareTo(Medical_Keyword o) {
		return this.word.charAt(0) - o.word.charAt(0);
	}

	private enum KEYWORD_CODE{
		
		ADMIN("0","Administrativ term"),
		CAUSE("A","Agensrelatert begrep"),
		DIAGNOSE("D","Diagnoserelatert begrep"),
		ANATOMI("L","Begrep relatert til lokasjon/anatomi"),
		RELATION("R","Relasjonsbegrep"),
		SYMPTOM("S","Symptomrelatert begrep"),
		ACTION("T","Tiltaks/behandlingsrelatert begrep");
		
		@SuppressWarnings("unused")
		public String code;
		public String description;
		
		KEYWORD_CODE(String co, String desc){
			code = co;
			description = desc;
		}
		
		
	}






















	
}


